/[a-zA-z]{5,}|^\D$|^[a-z]*$|^[A-Z]*$|^\w{,6}$/
這或許是一般人學程式碼之前心裡所想像的程式碼,充滿新奇卻又讓人望之卻步,但在學了程式碼之後,特別是 Ruby 這種語法貼近英文的語言時,往往會覺得程式語言沒有這麼嚇人,不過,上述這行的確是程式碼,而且 Ruby 也的確會使用它,正確來說,許多程式語言都有這個東西。
這段程式碼叫做正規表示式 (Regular Expression,簡稱:RegExp),是處理文字非常重要的利器,當你希望找尋特定文字的格式時,正規表示式是不可或缺的存在。
在 Ruby 裡面,有幾種方式可以定義正規表示式:
/
將正規表示式包起來,像是 /[a-zA-Z]*/
Regexp.new('[a-zA-Z]*')
,而這種方式不需要加 slash,而是將內容以字串方式傳入即可。%r{[a-zA-Z]*}
的方式表達。以下正規表示式的意思是:
/[a-zA-z]{5,}|^\D$|^[a-z]*$|^[A-Z]*$|^\w{,6}$/
[a-zA-z]{5,}
含有連續5個以上的大小寫英文字母^\D$
整串沒有數字^[a-z]*$
整串只有小寫字母^[A-Z]*$
整串只有大寫字母^\w{,6}$
整串字元少於或等於6這裡整理一個表格給大家參考:
Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.
這裡我舉一個剛學 Ruby 時遇到的 Codewars lv7 的題目,當時的情境是,我查到了要用哪個表示法,不過我完全看不懂,所以就寫了個最陽春的方法:
# 幫信用卡打馬賽克
# maskify('4556364607935616') # should return '############5616'
def maskify(card_number)
if card_number.length < 4
card_number
else
"#{ '#' * (card_number.length - 4) }#{ card_number[-4, 4]}"
end
maskify('4556364607935616')
maskify('1')
maskify('11111')
#{ card_number[-4, 4]}
這段的意思是從倒數第 4 個位置開始取 4 個單位。
如果你會正規表示式,你可以改成如下寫法,如果你要代換的字不止一個,可以用 gsub
這個方法,這裡先提供 ruby-doc 的使用範例:
def maskify(card_number)
card_number.gsub(/.(?=....)/, '#')
end
這裡跟大家介紹一個網站 rubular,可以在上面試試你想要的結果如下:
這裡再補充一下上面取值的用法,不知道大家是否看過前面的「數字與字串」篇,來回顧一下:
puts "我是不是很可愛?"[-3..-2] # 印出 可愛
puts "我是不是很可愛?"[-3, 2] # 印出 可愛
以上兩行程式碼雖然結果一樣,但是用法不同,這在新手時也有可能搞錯,大家不防試試。
此文同步刊登於CJ-Han的網站